package ca.etsmtl.log120.tp1.io;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
import java.util.Observable;

/******************************************************
Cours : LOG120
Session : E2011
Groupe : 01
Projet : Laboratoire #1
Etudiants : Nicolas Blais Miko
 	 		Yohan Trepanier-Montpetit
Codes perm. : BLAN24079109
			  TREY16079108
Professeur : Chamseddine Talhi
Charge de labo : Eric Goulet
Nom du fichier : SocketReader.java
Date cree : 2011-05-15
Date dern. modif. 2015-05-15
*************************************************** ****
Historique des modifications
*************************************************** ****
2011-05-15 Version initiale (Yohan Trepanier)
***************************************************/

/**
 * Classe responsable de la lecture d'un socket
 * @author Yohan
 *
 */
public class SocketReader extends Observable implements Runnable {

	private static final CharSequence COMMAND_STRING = "commande";
	private boolean running; //Pour arreter le thread
	private String lastString = "";  //Dernier message recu
	private InputStreamReader input; 	//Pour le contenu entrant
	
	/**
	 * Constructeur
	 * @param socket Le socket a ecouter
	 */
	public SocketReader(Socket socket){

		//Mise en memoire de l'input du socket
		try{
			input = new InputStreamReader(socket.getInputStream());
		}catch (Exception e){
			e.printStackTrace();
		}
	}

	@Override
	public void run() {
		
		String temp = ""; //Pour la commande en reception
		
		running = true; 	//activation du thread
		
		while(running){ //Tant qu'on ne demande pas d'arreter, on lit
			
			try { 
				char buffer = (char)input.read(); //lecture
				if(buffer <= 200){	//si c'est un charactere
					temp = temp + "" + buffer; //on l'ajoute a la memoire de reception
				}
				
				//si c'est un retour de ligne
				if(buffer == ('\n')){
					//on met le string en memoire et on reset la memoire de reception
					setLastString(temp);
					temp = "";
				}

			} catch (IOException e) {
				
				e.printStackTrace();
			}
			
			//pour ne pas overloader les processeurs
			try {
				Thread.sleep(1); //On attend 10 ms dans le thread entre chaque lecture
			} catch (InterruptedException e) {
				e.printStackTrace();
			}	
		}
	}
	
	/**
	 * Methode permettant de mettre fin a la lecture
	 */
	public void endThread(){
		running = false;
	}
	
	/**
	 * Aller chercher le dernier message recu
	 * @return Le dernier message recu
	 */
	public String getLastString(){
		return lastString;
	}
	
	/**
	 * Mettre un message recu en memoire
	 * @param string Le message
	 */
	private void setLastString(String string){
		
		//on met le message en memoire et on avise les amis
		lastString = string;
		if(!string.contains((CharSequence)COMMAND_STRING)){
			setChanged();
			notifyObservers();
		}
	}

	
}
